#include "ffmpeg_mixing_shear.h"
#include<qdebug.h>
#include<QCoreApplication>
ffmpeg_mixing_shear::ffmpeg_mixing_shear(QObject *parent) : QObject(parent)
{
    //处理完成事件
    QObject::connect(&process, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
                             [=] (int exitCode, QProcess::ExitStatus exitStatus) {

                           qDebug()<< "Exit code: " << exitCode
                           << "Exit status: " << exitStatus;

                           emit signal_ffmover();
   //读取控制台输出
   connect(&process , SIGNAL(readyReadStandardOutput()) , this , SLOT(on_readoutput()));
   //读取控制台输出错误
   connect(&process , SIGNAL(readyReadStandardError()) , this , SLOT(on_readerror()));

    });
}

QStringList ffmpeg_mixing_shear::video_coding_ts(QStringList filelist,int bt,int w,int h, QString outpath)
{
    QString dir_str =QString(outpath+"/"+"temp_编码");
    // 检查目录是否存在，若不存在则新建
    QDir dir;
    if(!dir.exists(dir_str))
    {
          bool res = dir.mkpath(dir_str);
    }
    path_coding_ts=dir_str;

    QStringList coding_filelist;
    for(int i=0;i<filelist.count();i++)
    {
        QString outfilename=QString::number(i)+"_tempfile.ts";
        QString newoutfilename=QString(dir_str+"/"+outfilename);
        coding_filelist.append(newoutfilename);
        //设置合理的码率，帧率，分辨率，关键帧间隔，音视频编码格式等参数
        /*然后使用命令ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.wav 完成对视频的拼接，这种方式也是拼接最快的方式。大致原理是直接将视频首位相接，不会涉及到编解码，整体执行的时间主要是磁盘IO的时间，我们实测100个文件，拼接成一个5g大的长视频，也只需要几十秒的时间。
但是，这种拼接方式有自己的局限，首先它只能拼接相同编码的视频，比如都是mp4。而且，这种方式也有bug，拼接mp4视频文件得出来的视频时长不对，就是我开头所说的问题，因为这个bug我们差点改业务需求。不过这个bug可以绕过去，就是将所有mp4文件先转成ts文件，然后对ts文件拼接，拼接ts视频不会出现这个bug。
*/
        //ffmpeg -i input.mp4 -c:v copy ouput.ts
        QString program="ffmpeg";
        QStringList argu;
        argu.append("-y");
        argu.append("-i");argu.append(filelist[i]);
        argu.append("-b:v");argu.append(QString("%1").arg(bt));
        argu.append("-s");argu.append(QString("%1*%2").arg(w).arg(h));
        //1
        //argu.append("-c:v");argu.append("copy");
        //2
        //argu.append("-r");argu.append("30");
        argu.append("-c:v");argu.append("libx264"); argu.append("-crf"); argu.append("23"); argu.append("-profile:v"); argu.append("high");/*argu.append("-preset:v");argu.append("fast"); */argu.append("-level"); argu.append("5");
        argu.append("-c:a");argu.append("aac");
        argu.append("-b:a");argu.append("240k");

        argu.append(newoutfilename);

        process.start(program,argu);
        emit signal_infoout(QString("已编码视频数:%1").arg(i),"正在编码...");
        process.waitForFinished(-1);
    }

    qDebug()<<"编码结束";
    return coding_filelist;
}

QStringList ffmpeg_mixing_shear::video_coding_mp4(QStringList filelist, int bt, int w, int h, QString outpath)
{
    QString dir_str =QString(outpath+"/"+"temp_编码");
    // 检查目录是否存在，若不存在则新建
    QDir dir;
    if(!dir.exists(dir_str))
    {
          bool res = dir.mkpath(dir_str);
    }
    path_coding_mp4=dir_str;

    QStringList coding_filelist;
    for(int i=0;i<filelist.count();i++)
    {

        QString outfilename=QString::number(i)+"_tempfile.mp4";
        QString newoutfilename=QString(dir_str+"/"+outfilename);
        coding_filelist.append(newoutfilename);
        //设置合理的码率，帧率，分辨率，关键帧间隔，音视频编码格式等参数
        /*然后使用命令ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.wav 完成对视频的拼接，这种方式也是拼接最快的方式。大致原理是直接将视频首位相接，不会涉及到编解码，整体执行的时间主要是磁盘IO的时间，我们实测100个文件，拼接成一个5g大的长视频，也只需要几十秒的时间。
但是，这种拼接方式有自己的局限，首先它只能拼接相同编码的视频，比如都是mp4。而且，这种方式也有bug，拼接mp4视频文件得出来的视频时长不对，就是我开头所说的问题，因为这个bug我们差点改业务需求。不过这个bug可以绕过去，就是将所有mp4文件先转成ts文件，然后对ts文件拼接，拼接ts视频不会出现这个bug。
*/
        //ffmpeg -i input.mp4 -c:v copy ouput.ts
        QString program="ffmpeg";
        QStringList argu;
        argu.append("-y");
        argu.append("-i");argu.append(filelist[i]);
        argu.append("-b:v");argu.append(QString("%1").arg(bt));
        argu.append("-s");argu.append(QString("%1*%2").arg(w).arg(h));
        //1
        //argu.append("-c:v");argu.append("copy");
        //2
        //argu.append("-r");argu.append("30");
        argu.append("-c:v");argu.append("libx264"); argu.append("-crf"); argu.append("23"); argu.append("-profile:v"); argu.append("high");/*argu.append("-preset:v");argu.append("fast"); */argu.append("-level"); argu.append("5");
        argu.append("-c:a");argu.append("aac");
        argu.append("-b:a");argu.append("240k");

        argu.append(newoutfilename);

        process.start(program,argu);
        emit signal_infoout(QString("已编码视频数:%1").arg(i),"正在编码...");
        process.waitForFinished(-1);//太耗时,传不出ffmpeg的信息

    }

    qDebug()<<"编码结束";
    return coding_filelist;
}

QStringList ffmpeg_mixing_shear::Video_mute(QStringList filelist,QString outpath)//最好放在线程里
{
    //ffmpeg -i L99.mp4 -an J99.mp4
    //ffmpeg -i G:\hi.mp4 -c:v copy -an G:\nosound.mp4
    //创建临时文件夹

    QString dir_str =QString(outpath+"/"+"temp_静音");
    path_mute=dir_str;
    // 检查目录是否存在，若不存在则新建
    QDir dir;
    if(!dir.exists(dir_str))
    {
          bool res = dir.mkpath(dir_str);
    }

    QStringList mute_filelist;//静音

    for(int i=0;i<filelist.count();i++)
    {
        QString program="ffmpeg";
        QStringList argu;
        //QString str=QString("-i %1 -c:v copy -an %2").arg(filelist[i]).arg().arg();
        //argu=str.split(" ");//文件名中可能有空格,此方法不好
        QString newoutfilename=QString(dir_str+"/"+QString::number(i)+"_tempfile.mp4");

        mute_filelist.append(newoutfilename);
        argu.append("-y");
        argu.append("-i");argu.append(filelist[i]);argu.append("-c:v");argu.append("copy");argu.append("-an");argu.append(newoutfilename);

        process.start(program,argu);
        process.waitForFinished(-1);
    }

    qDebug()<<"静音完成";

    return mute_filelist;
}

double ffmpeg_mixing_shear::getvideo_timelen(QString videoname)
{
    AVFormatContext *pFormatCtx = NULL;
    double times;

    av_register_all();
    avformat_network_init();

    QByteArray arr;
    arr.append(videoname);
    char *file=arr.data();

    if(avformat_open_input(&pFormatCtx,file,NULL,NULL) !=0 )
    //if(avformat_open_input(&pFormatCtx, "http://vfx.mtime.cn/Video/2019/01/15/mp4/190115161611510728_480.mp4", NULL, NULL)!=0)
    //if(avformat_open_input(&pFormatCtx, "/home/llw/Desktop/output.mp4", NULL, NULL)!=0)
    {
        fprintf(stderr,"err!");
        qDebug()<<"file="<<file;
        qDebug()<<"if(avformat_open_input(&pFormatCtx,file,NULL,NULL) !=0 )";
        return -1;
    }

    times = pFormatCtx->duration/1000000;	//duration单位是us，转化为秒
    printf("time:%d\n",times);

    avformat_close_input(&pFormatCtx);	//释放动作

    return times;
}

QStringList ffmpeg_mixing_shear::video_picture_cut(QStringList filelist,int w,int h,int px,int py, QString outpath)
{
    QString dir_str =QString(outpath+"/"+"temp_画面裁剪");
    path_piccut=dir_str;
    // 检查目录是否存在，若不存在则新建
    QDir dir;
    if(!dir.exists(dir_str))
    {
          bool res = dir.mkpath(dir_str);
    }

    QStringList return_filelist;//返回

    for(int i=0;i<filelist.count();i++)
    {
        QString program="ffmpeg";
        QStringList argu;
        //ffmpeg -i a.mov -strict -2 -vf crop=1080:1080:0:420 out.mp4
        //argu=str.split(" ");//文件名中可能有空格,此方法不好
        QString newoutfilename=QString(dir_str+"/"+QString::number(i)+"_tempfile.mp4");

        return_filelist.append(newoutfilename);
        argu.append("-y");
        argu.append("-i");argu.append(filelist[i]);argu.append("-strict");argu.append("-2");argu.append("-vf");
        argu.append(QString("crop=%1:%2:%3:%4").arg(w).arg(h).arg(px).arg(py));
        argu.append(newoutfilename);

        process.start(program,argu);
        process.waitForFinished(-1);

    }

    qDebug()<<"画面裁剪完成";

    return return_filelist;
}

QStringList ffmpeg_mixing_shear::video_cut(QStringList filelist, QTime Each_period_of_time,QString outpath)
{
    QStringList returnfilelsit;//return

    QDir dir;
    QString dir_str=QString(outpath+"/"+"temp_切割");
    path_cut=dir_str;
    if(!dir.exists(dir_str))
    {
          bool res = dir.mkpath(dir_str);
    }

    for(int i=0;i<filelist.count();i++)
    {
        //时长
        double time=getvideo_timelen(filelist[i]);//单位秒
        if(time==-1)
            return QStringList();
        QTime timelen(0,0,0);
        timelen = timelen.addSecs(time);
        //
        QString outfile=dir_str+"/"+QString("%1_tempfile.mp4").arg(QString::number(i));
        QStringList temp =  cut(filelist[i],timelen,Each_period_of_time,outfile);
        returnfilelsit.append(temp);
        QThread::sleep(1);
    }

    qDebug()<<"分割视频完成";

    return returnfilelsit;
}

QStringList ffmpeg_mixing_shear::cut(QString filename, QTime sumtime, QTime eachtime, QString outfilename)
{
    //return
    QStringList filelist;

    int count=(sumtime.hour()*60*60+sumtime.minute()*60+sumtime.second())/(eachtime.hour()*60*60+eachtime.minute()*60+eachtime.second());

    qDebug()<<filename<<"\n"<<sumtime<<"\n"<<eachtime<<"\n"<<count;

    int miao=eachtime.hour()*60*60+eachtime.minute()*60+eachtime.second();
    qDebug()<<"miao="<<miao;
    for(int i=1;i!=count+2;i++)
    {
         //1. ffmpeg -ss 00:00:00 -i test.mp4 -c copy -t  600  output.mp4
        QString program="ffmpeg";
        QStringList argu;
        QString argu_time;

        if(i==1)
            eachtime=QTime(0,0,0);
        else
        {
            if(i>=2)
               eachtime= eachtime.addSecs(miao);
        }
        argu_time=eachtime.toString("hh:mm:ss");
        argu.append("-ss");argu.append(argu_time);argu.append("-i");
        argu.append(filename);argu.append("-c");argu.append("copy");
        argu.append("-t");argu.append(QString::number(miao));
        QString temp=outfilename;
        QString newoutfilename=temp.insert(temp.length()-4,QString("_%1").arg(i));
        argu.append(newoutfilename);
        filelist.append(newoutfilename);

        //qDebug()<<"begin="<<argu;
        process.start(program,argu);
        process.waitForFinished(-1);

    }


    return filelist;
}

QString ffmpeg_mixing_shear::video_merge(QStringList filelist,QString outpath)
{
    //qDebug()<<"befroe="<<filelist;
    std::random_shuffle(filelist.begin(), filelist.end());//随机排序
    //qDebug()<<"after="<<filelist;

    //创造路径
    QString dir_str=(outpath+"/"+"temp_合并视频");
    QDir dir(dir_str);
    if(dir.exists()==false)
    {
        dir.mkpath(dir_str);
    }
    path_merge=dir_str;

    //不同尺寸的视频可以正常合成，但是不同格式的合成有问题
    //文件列表ffmpeg -f concat -i filelist.txt -c copy output.mkv
    //./ffmpeg.exe -f concat -safe 0 -i ./fileToMerge.txt -c copy -y ./out.mp4
    //不用-c copy
    //-c:v libx264 -crf 23 -profile:v high -level 5 -c:a aac -b:a 240k //尝试了,会卡顿,要不先压制再合并
    QString filename=dir_str+"/"+ QString("合并视频列表.txt");
    QFile file;
    file.setFileName(filename);
    if(file.open(QIODevice::WriteOnly)==true)
    {
//        file 'input1.mkv'
//        file 'input2.mkv'
        for(int i=0;i<filelist.count();i++)
        {

            file.write(QString("file '%1'\n").arg(filelist[i]).toUtf8());
        }

        file.close();
    }
    else
    {
        qDebug()<<"打开文件失败";
    }

    //文件名
    const QString outfilename=dir_str+"/"+"合并的视频.mp4";
    QString program="ffmpeg";
    QStringList argu;

    //ffmpeg.exe -f concat -safe 0 -i ./fileToMerge.txt -c copy -y ./out.mp4
    //-c:v libx264 -crf 23 -profile:v high -level 5 -c:a aac -b:a 240k//尝试了,会卡顿,要不先压制再合并
    argu.append("-y");

    argu.append("-f");argu.append("concat");argu.append("-safe");argu.append("0");argu.append("-i");argu.append(file.fileName());
    //2
    //argu.append("-r");argu.append("30");
//    argu.append("-b:v");argu.append("4000");
//    argu.append("-s");argu.append("1280*120");
//    argu.append("-c:v");argu.append("libx264"); argu.append("-crf"); argu.append("23"); argu.append("-profile:v"); argu.append("high");argu.append("-preset:v");argu.append("fast");argu.append("-level"); argu.append("5");
//    argu.append("-c:a");argu.append("aac");
//    argu.append("-b:a");argu.append("240k");
    //1
    argu.append("-c");argu.append("copy");
    argu.append(outfilename);

    process.start(program,argu);
    process.waitForFinished(-1);


    qDebug()<<"合并结束";
    return outfilename;

}

QStringList ffmpeg_mixing_shear::video_tailor(QStringList videofile, int time_befor, int time_end,QString outpath)
{
    QStringList returnlist;
    QString dirstr=outpath+"/temp_裁剪开头结尾";
    QDir dir(dirstr);
    if(dir.exists()==false)
        dir.mkpath(dirstr);
    file_tailor=dirstr;

    for(int i=0;i<videofile.count();i++)
    {
        QString program="ffmpeg";
        QStringList argu;

        QTime timebegin(0,0,0);
        timebegin=timebegin.addSecs(time_befor);
        int sumtime=getvideo_timelen(videofile[i]);
        int lasttime=sumtime-time_befor-time_end;
        if(lasttime<=0)
            continue;

        //输出名字
        QString outfilename=dirstr+"/"+QString("%1_已裁剪的视频.mp4").arg(i);
        returnlist.append(outfilename);
        argu.append("-y");argu.append("-ss");argu.append(timebegin.toString("hh:mm:ss"));
        argu.append("-i"); argu.append(videofile[i]);
        argu.append("-t");argu.append(QString::number(lasttime));
        argu.append("-c:v");argu.append("copy");
        argu.append("-c:a");argu.append("copy");
        argu.append(outfilename);

        process.start(program,argu);
        process.waitForFinished(-1);
        QThread::sleep(4);
    }

    qDebug()<<"裁剪开头结尾";
    return returnlist;
}

QString ffmpeg_mixing_shear::addsuiyin(QString video,QString suiyin,int fontsize,int px,int py, QString outpath)
{
    QString outfilename=outpath+"/"+"添加水印的视频.mp4";
    file_addsuiyin=outfilename;

    //文字
    //ffmpeg -i input.flv -vf "drawtext=fontfile=simhei.ttf: text='雷':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" drawtext.mp4
    //ffmpeg -i input.ts -c:v libx264 -b:v 4000k -c:a copy -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:x=20:y=20" output.ts
   \
    QString program="ffmpeg";
    QStringList argu;
    argu.append("-y");
    argu.append("-i");
    QString dirstr=QCoreApplication::applicationDirPath()+"/"+"data";//绝对路径
    argu.append(video);

    argu.append("-vf");argu.append(QString("drawtext=fontsize=%1:fontfile='%2':text='%3':fontcolor=red:x=%4:y=%5").arg(fontsize) .arg(dirstr+"/STKAITI.TTF").arg(suiyin).arg(px).arg(py));
    argu.append(outfilename);

    process.start(program,argu);
    process.waitForFinished(-1);
    qDebug()<<"添加水印";
    return outfilename;
}

QString ffmpeg_mixing_shear::addaudio( QString video, QStringList audio, QString outpath)
{

    //ffmpeg -f concat -i target.txt -c copy BGM.mp3
    //ffmpeg -i BGM.mp3 -ss 00:00:00.0 -t 00:01:25 -acodec copy BGM1.mp3
    //ffmpeg -i BGM1.mp3 -i target.mp4 -y BGM.mp4

    QString dirstr=outpath+"/"+"temp_添加音频";
    QDir dir(dirstr);
    if(dir.exists()==false)
        dir.mkpath(dirstr);

    path_addaud=dirstr;

    //合并音频
    std::random_shuffle(audio.begin(), audio.end());//随机排序
    QString filename_yinpinlist=dirstr+"/"+ QString("合并音频列表.txt");
    QFile file;
    file.setFileName(filename_yinpinlist);
    if(file.open(QIODevice::WriteOnly)==true)
    {
//        file input1.mkv'
//        file 'input2.mkv'
        for(int i=0;i<audio.count();i++)
        {
            //Unsafe file name 'F:/音乐/Alan Silvestri - Im'  解决bug
            //Unsafe file name 'F:/音乐/Alan Silvestri - Im ForrestForrest Gump.mp3'
            //audio[i]=audio[i].replace("'","'");

            file.write(QString("file '%1'\n").arg(audio[i]).toUtf8());
        }
        file.close();
    }
    else
    {
        qDebug()<<"打开文件失败";
    }

    //文件名
    const QString yinpin_filename=dirstr+"/"+"合并的音频.mp3";
    QString program="ffmpeg";
    QStringList argu;
    //ffmpeg -f concat -i target.txt -c copy BGM.mp3
    //Unsafe file name
    //ffmpeg.exe -f concat -safe 0 -i ./fileToMerge.txt -c copy -y ./out.mp4
    argu.append("-y");
    argu.append("-f");argu.append("concat");argu.append("-safe");argu.append("0"); argu.append("-i");argu.append(filename_yinpinlist);argu.append("-c");argu.append("copy");argu.append(yinpin_filename);
    process.start(program,argu);
    process.waitForFinished(-1);

    //切割音频
    QString newyinping= cutaudio(video,yinpin_filename);

    //合并
    //合并的视频存放在QString dirstr=outpath+"/"+"temp_添加音频";
    QString outvideoname=dirstr+"/"+"已添加音频的视频.mp4";
    QString newvideo= hebinvid_aud(video,newyinping,outvideoname);

    qDebug()<<"添加音频完成";

    return newvideo;
}

QString ffmpeg_mixing_shear::cutaudio(QString video,QString yinpin_filename)
{
    //切割音频
    //ffmpeg -i BGM.mp3 -ss 00:00:00.0 -t 00:01:25 -acodec copy BGM1.mp3
    double time=getvideo_timelen(video);
    QTime timelen(0,0,0);
    timelen=timelen.addSecs(time);

    QString newyinpin=yinpin_filename;
    newyinpin=newyinpin.insert(newyinpin.length()-4,"_new");

    QString program="ffmpeg";
    QStringList argu;argu.append("-y");
    argu.append("-i");argu.append(yinpin_filename);argu.append("-ss");argu.append("00:00:00.0");argu.append("-t");argu.append(timelen.toString("hh:mm:ss"));
    argu.append("-acodec");argu.append("copy");argu.append(newyinpin);


    process.start(program,argu);
    process.waitForFinished(-1);
    qDebug()<<"切割音频";

    return newyinpin;
}

QString ffmpeg_mixing_shear::hebinvid_aud(QString video, QString yinping,QString outfilename)
{
    //ffmpeg -i BGM1.mp3 -i target.mp4 -y BGM.mp4,重新编码
    //不编码
   //ffmpeg -y -i F:/test.mp4 -i F:/test.mp3 -filter_complex [0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.5[a0];[1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.5[a1];[a0][a1]amix=inputs=2:duration=first[aout]
    //-map [aout] -ac 2 -c:v copy -map 0:v:0 F:/out.mp4
    QString program="ffmpeg";
    QStringList argu;

    argu.append("-i");
    argu.append(video);

    argu.append("-i");
    argu.append(yinping);

    argu.append("-c:v");argu.append("copy");
    argu.append("-c:a");argu.append("copy");


    argu.append("-y");
    argu.append(outfilename);//重新编码

//    argu.append("-y");argu.append("-i");argu.append(video);argu.append("-i");argu.append(yinping);
//    argu.append("-filter_complex");
//    argu.append("[0:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.5[a0];[1:a]aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=0.5[a1];[a0][a1]amix=inputs=2:duration=first[aout]");
//    argu.append("-map");
//    argu.append("[aout]");argu.append("-ac");argu.append("2");argu.append("-c:v");argu.append("copy");argu.append("-map");argu.append("0:v:0");
//    argu.append(outfilename);

    process.start(program,argu);
    process.waitForFinished(-1);
    qDebug()<<"合并音视频";

    return outfilename;
}

QString ffmpeg_mixing_shear::addzimufile( QString videofile,QString zimufile, QString outpath)
{
    //ffmpeg -i test_1280x720_3.mkv -vf subtitles=test_1280x720_3.srt out.mp4//硬
    //ffmpeg -i test_1280x720_3.mp4 -i test_1280x720_3.srt -c copy output.mkv
    //ffmpeg -i video.avi -vf "ass=subtitle.ass" out.avi
    /*ffmpeg -i “C:/Users/1/Desktop/新建文件夹 (4)/12.mp4” -filter_complex “subtitles=C:/Users/1/Desktop/新建文件夹 (4)/12.srt:force_style=‘Alignment=2,OutlineColour=&H100000000,BorderStyle=1,Outline=1,Shadow=0,Fontsize=8,MarginL=10,MarginV=15’” -crf 1 -c:a copy “C:/Users/1/Desktop/新建文件夹 (4)/out.mp4”
    */

    //坑
    //1.把这个路径转义了就完事 "subtitles=‘D:\tex\12.srt’,windons下不能用D:/   //不适用于windows
//    很明显，这个命令在执行的时候，ass文件的路径变了。
//    纠结了好久发现，ass=后面这个文件路径，在windows系统下面不能够使用盘符（如D:\xxxx）,只能使用相对路径。
//    所以将字幕文件放到根目录下

    //2.相对路径的问题
    //cmd控制台:进入莫个文件加,即为根目录
    //qt调用cmd 进不了
    //qt调用ffmpeg 根目录是程序的存放目录,不是ffmpeg的安装目录

    QString dirstr_zimu=outpath+"/"+"temp_添加字幕";
    QDir dir_zimu(dirstr_zimu);
    if(dir_zimu.exists()==false)
        dir_zimu.mkpath(dirstr_zimu);

    path_addzimu=dirstr_zimu;



    zimufile = QDir::toNativeSeparators(zimufile);
    //字幕文件移动到程序根目录
    QString dirstr="./ffmeg临时目录";
    QDir dir(dirstr);
    if(dir.exists()==false)
        dir.mkpath(dirstr);

    QFileInfo info(zimufile);
    QString newzimufile=dirstr+"/"+info.fileName();
    QFile file(zimufile),filecopy(newzimufile);
    if(file.open(QIODevice::ReadWrite)==true&&filecopy.open(QIODevice::ReadWrite)==true)
    {
        filecopy.write(file.readAll());
        file.close();
        filecopy.close();
    }

    //命令
    //命名
    QString newvido=dirstr_zimu+"/"+"已添加字幕的视频.mp4";
    QString program="FFMPEG";
    QStringList argu;
    argu.append("-y");
    argu.append("-i");argu.append(videofile);

    argu.append("-vf");argu.append(QString("subtitles=%1").arg(newzimufile)); argu.append(newvido);
    QThread::sleep(5);
    process.start(program,argu);
    process.waitForFinished(-1);

    //删除临时字母
    bool isok= DeleteFileOrFolder(dirstr);
    if(isok)
        qDebug()<<"删除临时ffmpeg文件成功";
    //qDebug()<<"argu"<<argu;

    return newvido;
}

void ffmpeg_mixing_shear::video_cut_new(QString videofile, QTime whiletime, QString outfilename)
{
    //总时间
    QTime sumtime(0,0,0),eachtime;
    int time=getvideo_timelen(videofile);
    sumtime=sumtime.addSecs(time);

    eachtime=whiletime;

    int count=(sumtime.hour()*60*60+sumtime.minute()*60+sumtime.second())/(eachtime.hour()*60*60+eachtime.minute()*60+eachtime.second());

    qDebug()<<videofile<<"\n"<<sumtime<<"\n"<<eachtime<<"\n"<<count;

    int miao=eachtime.hour()*60*60+eachtime.minute()*60+eachtime.second();
    qDebug()<<"miao="<<miao;
    for(int i=1;i!=count+2;i++)
    {
         //1. ffmpeg -ss 00:00:00 -i test.mp4 -c copy -t  600  output.mp4
        QString program="ffmpeg";
        QStringList argu;
        QString argu_time;

        if(i==1)
            eachtime=QTime(0,0,0);
        else
        {
            if(i>=2)
               eachtime= eachtime.addSecs(miao);
        }
        argu_time=eachtime.toString("hh:mm:ss");
        argu.append("-y");
        argu.append("-ss");argu.append(argu_time);
        argu.append("-i");
        argu.append(videofile);
        argu.append("-c");argu.append("copy");
        argu.append("-t");argu.append(QString::number(miao));

        QString newoutfile=outfilename;
        if(i<10)
        {
            newoutfile=newoutfile.insert(newoutfile.length()-4,QString("0%1_").arg(i));
        }
        else {
            newoutfile=newoutfile.insert(newoutfile.length()-4,QString("%1_").arg(i));
        }

        argu.append(newoutfile);


        //qDebug()<<"begin="<<argu;
        process.start(program,argu);
        process.waitForFinished(-1);

    }

}

bool ffmpeg_mixing_shear::DeleteFileOrFolder(QString file)
{
    QString strPath=file;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除视频错误";
        return false;

    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

void ffmpeg_mixing_shear::on_readoutput()
{
   QString str(process.readAllStandardOutput().data());   //将输出信息读取到编辑框
   if(str.isEmpty())
       return;
   emit signal_infoout(str,nullptr);
   qDebug()<<str;

}
void ffmpeg_mixing_shear::on_readerror()
{
    QString str (process.readAllStandardError().data());
    if(str.isEmpty())
        return;
    emit signal_infoout(str,nullptr);
    qDebug()<<   str ;//弹出信息框提示错误信息

}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_mute()
{
    QString strPath=path_mute;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除错误";
        return false;
    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_cut()
{
    QString strPath=path_cut;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除错误";
        return false;

    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_merge()
{
    QString strPath=path_merge;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除错误";
        return false;

    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_coding_mp4()
{
    QString strPath=path_coding_mp4;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除错误";
        return false;

    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_coding_ts()
{
    QString strPath=path_coding_ts;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除错误";
        return false;

    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_piccut()
{
    QString strPath=path_piccut;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除错误";
        return false;

    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_addaudio()
{
    QString strPath=path_addaud;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除错误";
        return false;

    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_addzimu()
{
    QString strPath=path_addzimu;
    if (strPath.isEmpty() || !QDir().exists(strPath))//是否传入了空的路径||路径是否存在
    {
        qDebug()<<"删除错误";
        return false;

    }
    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile())//如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir())//如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_suiyin()
{
    return  DeleteFileOrFolder(file_addsuiyin);

}

bool ffmpeg_mixing_shear::DeleteFileOrFolder_tailor()
{
    return  DeleteFileOrFolder(file_tailor);

}
